package com.lxs.spring6.boot3.extend;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.stereotype.Component;

/**
 * 这个接口在读取项目中的beanDefinition之后执行，提供一个补充的扩展点
 * 使用场景：你可以在这里动态注册自己的beanDefinition，可以加载classpath之外的bean
 */
@Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
        // 动态注册Bean到容器 IOC之前执行
        System.err.println("【BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry】所有的Bean定义即将被加载，但Bean的实例还没被创建时。通常用于给IOC容器添加额外的组件");
        // 注册bean
        BeanDefinition beanDefinition = new GenericBeanDefinition();
        beanDefinition.setBeanClassName("java.util.Map");
        beanDefinitionRegistry.registerBeanDefinition("cache", beanDefinition);
        // 查询bean
        BeanDefinition cache = beanDefinitionRegistry.getBeanDefinition("cache");
        System.out.println("cache.isSingleton：" + cache.isSingleton());
        // 删除bean
        beanDefinitionRegistry.removeBeanDefinition("cache");
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
        // 可以用来在Bean实例化之前动态操作Bean的属性 去做增强
        System.err.println("【BeanDefinitionRegistryPostProcessor.postProcessBeanFactory】BeanFactory标准初始化之后，所有的Bean定义已经被加载，但Bean的实例还没被创建。通常用于修改bean的定义，Bean的属性值等，甚至可以在此快速初始化Bean");
//        System.err.println(configurableListableBeanFactory.getBeanDefinition("cache"));
    }
}
